package com.coder;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Collections;

/**
 * 代码生成器（只用一次）
 * mybatis-plus
 */
@SpringBootTest
public class GeneratorCode {

    // 常量方式定义
    private static final String AUTHOR = "zty";
    private static final String JDBC_URL = "jdbc:mysql://127.0.0.1:3306/auto_rental";
    private static final String JDBC_USERNAME = "root";
    private static final String JDBC_PASSWORD = "654321";
    private static final String OUT_DIR = ".\\src\\main\\java"; // 生成在该目录下
    private static final String PACKAGE_NAME = "com.coder"; // 包名
    private static final String MODULE_NAME = "rental"; // 模块名
    // 要生成的表
    private static final String[] TABLES = {
            "auto_maker", "auto_brand", "auto_info",
            "sys_dept", "sys_permission", "sys_role", "sys_user", "sys_role_permission", "sys_user_role",
            "busi_customer", "busi_maintain", "busi_violation", "busi_order", "busi_rental_type"
    };
    // 过滤前缀
    private static final String[] PREFIX = {"busi_", "sys_"};

    @Test
    void generatorCode() {
        FastAutoGenerator.create(JDBC_URL, JDBC_USERNAME, JDBC_PASSWORD)
                .globalConfig(builder -> { // 全局配置
                    builder.author(AUTHOR)
                            // 开启swagger支持
                            .enableSwagger()
                            .outputDir(OUT_DIR);
                })
                .packageConfig(builder -> { // 配置包结构
                    builder.parent(PACKAGE_NAME)
                            .moduleName(MODULE_NAME)
                            // windows系统中用\做文件分隔符（\\转义），mac unix linux中用/做文件分隔符 后端资源访问路径不是文件，用/
                            .pathInfo(Collections.singletonMap(OutputFile.xml, ".\\src\\main\\resources\\mapper")); // 输出的xml文件
                })
                .strategyConfig(builder -> { // 配置表相关
                    builder.addInclude(TABLES)
                            // 过滤
                            .addTablePrefix(PREFIX)
                            .entityBuilder()
                            .enableLombok()
                            // 允许生成链式编程模型 实体类中@Accessors(chain = true)
                            .enableChainModel()
                            .controllerBuilder()
                            // 使用rest风格去标注controller类
                            .enableRestStyle();
                })
                // 使用的模板引擎 freemarker
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();
    }
}
